//
// Created by Yalin on 2021/2/27.
//
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include "calc.h"

// 获取下一个操作符或者数字型操作数
int getop(char s[]){

    int i ,c;
    while ((s[0] = c = getch()) == ' ' || c == '\t') // 去除空格，s[0]一直是空格，直到非空格后跳出
        ;
    // 上面循环跑出来啦，c和s[0]是个非空格，
    s[1] = '\0';                                    // s[1]是字符串终结符，default分支要打印字符串，这边就得是这个才行
    i = 0;                                          //重新从s[0]开始收集

    if (islower(c)){
        while (islower(s[++i] = c = getchar()))
            ;
        s[i] = '\0';
        if (c != EOF)
            ungetch(c);
        if (strlen(s) > i)
            return NAME;
        else
            return c;
    }

    if(!isdigit(c) && c != '.' && c != '-')                     //不是数，操作符或者其他非法符号，直接返回到switch的default分支
        return c;

    if (c == '-')
        if(isdigit(c = getchar()) || c == '.')
            s[++i] = c;
        else {
            if (c != EOF)
                ungetch(c);
            return '-';
        }

    // 切记，此时c和s[0]是收集的过了前面分支的非空格字符，s[1]对应随便塞进去的字符
    if (isdigit(c))                                //收集整数部分
        while (isdigit(s[++i] = c = getch() )) //从getch拿来字符，向s[++i]中塞，直到遇到一个非数字字符
            ;
    //跳出时，s[i]和c是非数字字符

    if(c == '.')                                    //收集小数部分，此处的c是!isdigit的，是提前看的
        while (isdigit(s[++i] = c = getch() ))
            ;                                       //跳出时，s[i]和c也是非数字的

    s[i] = '\0';                                    // 把非数字的s[i]替换成一个字符串终结符，方便default分支打印
    if (c != EOF)                                   // 此处的c也是提前看了一个字符的
        ungetch(c);                                 //把这个(因为不符合而跳出来循环的)预读字符提前存到缓存区里
    return NUMBER;                                  //返回表示数字的宏，这样可以去数字分支处理，随便啥都行
}
